package com.tomoki.iwai.deviceinfo.db.dao;

import java.io.IOException;
import java.util.List;

import net.oauth.OAuth;
import net.oauth.OAuth.Parameter;

import com.google.appengine.repackaged.com.google.common.base.StringUtil;
import com.tomokey.oauth.OAuthWrapUtil;
import com.tomoki.iwai.deviceinfo.db.dto.AndroidDeviceInfoList;
import com.tomoki.iwai.deviceinfo.db.dto.AndroidDeviceInfoList.COLUMNS;
import com.tomoki.iwai.deviceinfo.dto.Device;

/**
 * AndroidDeviceInfoListテーブルのDAOクラス
 */
public class AndroidDeviceInfoListDao extends DaoBase
{
	/**
	 * レコードを登録する。
	 * 
	 * @param device Androidデバイス情報
	 * @return true:成功 false:失敗
	 */
	public boolean insert(Device device)
	{
		AndroidDeviceInfoList dto = new AndroidDeviceInfoList();
		
		dto.set(COLUMNS.Model, device.build.MODEL);
		dto.set(COLUMNS.Felica, device.build.FELICA);
		dto.set(COLUMNS.Board, device.build.BOARD);
		dto.set(COLUMNS.Brand, device.build.BRAND);
		dto.set(COLUMNS.Cpu_Abi, device.build.CPU_ABI);
		dto.set(COLUMNS.Device, device.build.DEVICE);
		dto.set(COLUMNS.Display, device.build.DISPLAY);
		dto.set(COLUMNS.FingerPrint, device.build.FINGERPRINT);
		dto.set(COLUMNS.Host, device.build.HOST);
		dto.set(COLUMNS.Id, device.build.ID);
		dto.set(COLUMNS.Manufacture, device.build.MANUFACTURER);
		dto.set(COLUMNS.Product, device.build.PRODUCT);
		dto.set(COLUMNS.Type, device.build.TYPE);
		dto.set(COLUMNS.Tags, device.build.TAGS);
		dto.set(COLUMNS.User, device.build.USER);
		dto.set(COLUMNS.Version_Codename, device.build.VERSION_CODENAME);
		dto.set(COLUMNS.Version_Incremental, device.build.VERSION_INCREMENTAL);
		dto.set(COLUMNS.Version_Release, device.build.VERSION_RELEASE);
		dto.set(COLUMNS.Version_Sdk, device.build.VERSION_SDK);
		dto.set(COLUMNS.Version_Sdk_Int, device.build.VERSION_SDK_INT);
		dto.set(COLUMNS.Useragent, device.build.USER_AGENT);
		dto.set(COLUMNS.Sensors, device.build.SENSORS);
		dto.set(COLUMNS.Density, device.display.DENSITY);
		dto.set(COLUMNS.Density_Dpi, device.display.DENSITY_DPI);
		dto.set(COLUMNS.Scaled_Density, device.display.SCALED_DENSITY);
		dto.set(COLUMNS.X_Dpi, device.display.XDPI);
		dto.set(COLUMNS.Y_Dpi, device.display.YDPI);
		dto.set(COLUMNS.Width_Pixels, device.display.WIDTH_PIXELS);
		dto.set(COLUMNS.Height_Pixels, device.display.HEIGHT_PIXELS);
		dto.set(COLUMNS.Antibanding, device.camera.ANTIBANDING);
		dto.set(COLUMNS.Color_Effect, device.camera.COLOR_EFFECT);
		dto.set(COLUMNS.Flash_Mode, device.camera.FLASH_MODE);
		dto.set(COLUMNS.Format, device.camera.FORMAT);
		dto.set(COLUMNS.Picture_Size, device.camera.SIZE);
		dto.set(COLUMNS.Jpeg_Thumbnail_Size, device.camera.JPEG_THUMBNAIL_SIZE);
		dto.set(COLUMNS.Preview_Fps_Range, device.camera.PREVIEW_FPS_RANGE);
		dto.set(COLUMNS.Preview_Size, device.camera.PREVIEW_SIZE);
		dto.set(COLUMNS.Scene_Mode, device.camera.SCENE_MODE);
		dto.set(COLUMNS.Video_Size, device.camera.VIDEO_SIZE);
		dto.set(COLUMNS.Zoom, device.camera.ZOOM_SUPPORTED);
		dto.set(COLUMNS.Smooth_Zoom, device.camera.SMOOTH_ZOOM_SUPPORTED);
		dto.set(COLUMNS.Max_Zoom, device.camera.MAX_ZOOM);
		dto.set(COLUMNS.White_Balance, device.camera.WHITE_BALANCE);
		
		return insert(dto);
	}
	
	/**
	 * レコードを登録する。
	 * 
	 * @param dto AndroidDeviceInfoListのDTO
	 * @return true:成功 false:失敗
	 */
	public boolean insert(AndroidDeviceInfoList dto)
	{
		// パラメータ
		List<Parameter> params = OAuth.newList("sql", dto.createInsertSql());
		
		try
		{
			//
			// 登録
			//
			String response = OAuthWrapUtil.invoke("tomokey", TOKEN, "POST", API_URL, params);
			
			if (response == null)
			{
				return false;
			}
			
			return true;
		}
		catch (IOException e)
		{
			return false;
		}
	}
	
	/**
	 * 該当レコードの有無を確認する。
	 * 
	 * @param fingerPrint Build.FINTERPRINT
	 * @return true:存在する false:存在しない
	 */
	public boolean isExists(String fingerPrint) throws IOException
	{
		AndroidDeviceInfoList dto = new AndroidDeviceInfoList();
		dto.set(COLUMNS.FingerPrint, fingerPrint);
		
		List<Parameter> params = OAuth.newList("sql", dto.createCountSql());
		
		String response = OAuthWrapUtil.invoke("tomokey", TOKEN, "POST", API_URL, params);
		
		if (StringUtil.isEmpty(response))
		{
			throw new IOException("Failed to check existence of row in Fusion Tables.");
		}
		
		// 1行目はヘッダ
		String[] splitted = response.split("\n");
		if (splitted.length >= 2 && splitted[1].matches("[1-9]+[0-9]*"))
		{
			return true;
		}
		
		return false;
	}
}
